package com.company.eos.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.company.eos.common.util.PageUtils;
import com.company.eos.controller.form.user.ResetPasswordDTO;
import com.company.eos.domain.User;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;

/**
 * @author: Song, Wei
 * @date: 2022-01-13
 */
public interface UserService extends IService<User> {

    /**
     * 根据userId查询用户的权限
     *
     * @param userId 用户ID
     * @return 权限列表
     */
    Set<String> searchUserPermissions(int userId);

    User selectUserByEmail(String email);

    /**
     * 查询用户角色
     *
     * @param userId
     * @return
     */
    ArrayList<String> searchUserRoles(int userId);

    public HashMap searchUserSummary(int userId);

    /**
     * 查询全部用户名称
     *
     * @return
     */
    ArrayList<HashMap> searchAllUser();

    /**
     * 根据ID查询用户信息
     *
     * @param userId
     * @return
     */
    public HashMap searchById(int userId);

    /**
     * 根据用户ID查询用户
     *
     * @param userId
     * @return
     */
    User selectById(int userId);

    /**
     * 添加用户
     *
     * @param user 用户实体
     * @return 影响行数
     */
    int insert(User user);

    /**
     * 查询用户分页记录
     *
     * @param param param
     * @return 用户分页记录
     */
    PageUtils searchUserByPage(HashMap param);

    /**
     * 修改用户
     *
     * @param param
     * @return
     */
    int update(HashMap param);

    /**
     * 删除用户
     *
     * @param ids 用户id
     * @return
     */
    int deleteUserByIds(Integer[] ids);

    /**
     * 离职用户
     *
     * @param ids 用户ID
     * @return 离职结果
     */
    int dismissUserByIds(Integer[] ids);

    /**
     * 查询用户名称和部门
     *
     * @param userId
     * @return
     */
    HashMap searchNameAndDept(int userId);

    /**
     * 向邮箱发送忘记密码的验证码邮件
     *
     * @param email 目标邮箱
     * @return 成功返回1
     */
    Integer sendVerify(String email);

    /**
     * 用户重置密码的DTO
     *
     * @param dto dto对象，包含邮箱、两次新密码、验证码
     * @return 修改成功返回 >=1 的整数，失败返回0
     */
    Integer resetPassword(ResetPasswordDTO dto);

    /**
     * 获取自己部门的经理，若没有则返回总经理，再没有返回管理员
     *
     * @param user 用户
     * @return 返回用户
     */
    User getDepManager(User user);

}
